import java.io.FileOutputStream;
import java.io.IOException;


public class Main 
{

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException 
	{
		int MAX_ITERACOES = 100, nFormigas = 100, energiaOtima = 0;
		double taxaFeromonioInicial = 0.25, taxaEvaporacaoFeromonio = 0.1;
		
		String strProteina = "hphpphhphpphphhpphph";
		String arquivoSaida = "estatisticas.txt";
		char[] proteina;
		
		for (int i = 0; i < args.length; i++)
		{
			if(args[i].equals("-m"))
				MAX_ITERACOES = Integer.parseInt(args[i+1]);
			else if(args[i].equals("-f"))
				nFormigas = Integer.parseInt(args[i+1]);
			else if(args[i].equals("-i"))
				taxaFeromonioInicial = Double.parseDouble(args[i+1]);
			else if(args[i].equals("-e"))
				taxaEvaporacaoFeromonio = Double.parseDouble(args[i+1]);
			else if(args[i].equals("-p"))
				strProteina = args[i+1];
			else if(args[i].equals("-o"))
				arquivoSaida = args[i+1];
			else if(args[i].equals("-s"))
				energiaOtima = Integer.parseInt(args[i+1]);
		}
		
		proteina = leProteina(strProteina);
		
		Colonia col;
		int somaEnergias = 0, solucoesOtimas = 0;
		int energias[] = new int[10];
		
		for(int i = 0; i < 10; i++)
		{
			col = new Colonia(proteina, taxaFeromonioInicial);
			col.solve(MAX_ITERACOES, nFormigas, taxaEvaporacaoFeromonio);
//			col.imprimeSolucao();
			energias[i] = col.getEnergiaSolucao();
			somaEnergias += col.getEnergiaSolucao();
			
			if(energias[i] == energiaOtima)
				solucoesOtimas++;
		}
		
		calculaEimprimeEstatisticas(energias, somaEnergias, solucoesOtimas);
//		imprimeEstatisticasPorExperimentoPlot(arquivoSaida, args, energias);
	}

	private static char[] leProteina(String strProteina)
	{
		char[] proteina = new char[strProteina.length()];
		for(int i = 0; i < strProteina.length(); i++)
		{
			proteina[i] = strProteina.charAt(i);
		}
		
		return proteina;
	}
	
	private static void calculaEimprimeEstatisticas(int energias[], int somaEnergias, int numeroOtimos)
	{
		double mediaEnergias, desvioEnergias;
		
		mediaEnergias = somaEnergias/10;
		
		System.out.println("Número de soluções ótimas: " + numeroOtimos);
		System.out.println("Média das energias-solução: -" + mediaEnergias);
		
		// Calcula o desvio padrao
		somaEnergias = 0;		
		for(int i = 0; i < 10; i++)
		{
			somaEnergias += Math.pow((energias[i] - mediaEnergias), 2.0);
		}		
		desvioEnergias = Math.sqrt((1.0/(30-1)) * somaEnergias);
		
		System.out.println("Desvio padrão das energias: " + desvioEnergias);
	}
	
	private static void imprimeEstatisticasPorExperimentoPlot(String arquivoSaida, String args[], int[] energias) throws IOException
	{
		String nomeArquivo = "";
		double value = 0.0;
		
		// Agrupa as estatisticas ao variar tamamho da populacao, numero de geracoes e
		// operadores geneticos em aquivos separados
		if(arquivoSaida.contains("0p"))
		{
			for(int i = 0; i < args.length; i++)
			{
				if(args[i].equals("-t"))
					value = Double.parseDouble(args[i+1]);
			}
			nomeArquivo = arquivoSaida.replace(("0p" + value).replace(".0", ""), "0P");
		}
		else if(arquivoSaida.contains("0g"))
		{
			for(int i = 0; i < args.length; i++)
			{
				if(args[i].equals("-g"))
					value = Double.parseDouble(args[i+1]);
			}
			nomeArquivo = arquivoSaida.replace(("0g" + value).replace(".0", ""), "0G");
		}
		else if(arquivoSaida.contains("0m"))
		{
			for(int i = 0; i < args.length; i++)
			{
				if(args[i].equals("-m"))
					value = Double.parseDouble(args[i+1]);
			}
			nomeArquivo = arquivoSaida.replace(("0m" + value).replace(".", ""), "0M");
		}
		else if(arquivoSaida.contains("0c"))
		{
			for(int i = 0; i < args.length; i++)
			{
				if(args[i].equals("-c"))
					value = Double.parseDouble(args[i+1]);
			}
			nomeArquivo = arquivoSaida.replace(("0c" + value).replace(".", ""), "0C");
		}
		else return;
		
		// Arquivo no formato aceito pelo gnuplot
		FileOutputStream appendFile = new FileOutputStream("graficos/" + nomeArquivo.replace(".txt", "_PlotEstatisticas.txt"), true);
		
		int somaEnergias = 0;		
		for(int i = 0; i < 10; i++)
		{
			somaEnergias += energias[i];
		}
		
		String linha;
		linha = value + " " + (somaEnergias/10);
		appendFile.write(linha.getBytes());
		
		appendFile.close();
	}
}
